#pragma once

#include "znx_yaml_parser.h"

typedef znx_bool_t(*znx_process_phase_handle)();

typedef znx_bool_t(*znx_module_conf_parse_handle)(
    void *conf, znx_pool_t *pool, yaml_document_t *doc,
    yaml_node_t *root, znx_str_t *err);

typedef znx_bool_t(*znx_core_conf_post_handle)();


typedef struct znx_http_site_conf_s         znx_http_site_conf_t;
#if 0
typedef struct znx_http_addr_site_conf_s    znx_http_addr_site_conf_t;
typedef struct znx_http_loc_conf_s          znx_http_loc_conf_t;
#endif

typedef znx_bool_t(*znx_http_site_module_conf_parse)(
    void *conf, znx_pool_t *pool, yaml_document_t *doc,
    yaml_node_t *root, znx_str_t *err);
typedef znx_bool_t(*znx_http_addr_site_module_conf_parse)(
    void *conf, znx_pool_t *pool, yaml_document_t *doc,
    yaml_node_t *root, znx_str_t *err);
typedef znx_bool_t(*znx_http_loc_module_conf_parse)(
    void *conf, znx_pool_t *pool, yaml_document_t *doc,
    yaml_node_t *root, znx_str_t *err);
typedef znx_bool_t(*znx_http_main_module_conf_post_handle)();
typedef znx_bool_t(*znx_http_site_module_conf_post_handle)(znx_http_site_conf_t *site_conf);


typedef struct {
    int                             index;
    znx_str_t                       name;
    znx_module_conf_parse_handle    conf_parse;
    znx_core_conf_post_handle       conf_post;
    znx_process_phase_handle        main_init;
    znx_process_phase_handle        worker_init;
    znx_process_phase_handle        worker_proc_exit;
    znx_process_phase_handle        worker_exit;
    znx_process_phase_handle        main_exit;
} znx_core_module_t;

extern znx_core_module_t            *core_modules[];
extern int                          core_modules_num;


typedef struct {
    int                                     index;
    znx_str_t                               name;
    znx_module_conf_parse_handle            main_conf_parse;
    znx_http_main_module_conf_post_handle   main_conf_post;
    znx_http_site_module_conf_parse         site_conf_parse;
    znx_http_addr_site_module_conf_parse    addr_site_parse;
    znx_http_loc_module_conf_parse          loc_conf_parse;
    znx_http_site_module_conf_post_handle   site_conf_post;
    znx_process_phase_handle                main_init;
    znx_process_phase_handle                worker_init;
    znx_process_phase_handle                worker_proc_exit;
    znx_process_phase_handle                worker_exit;
    znx_process_phase_handle                main_exit;
} znx_http_module_t;

extern znx_http_module_t            *http_modules[];
extern int                          http_modules_num;


void znx_modules_init();

void znx_modules_main_init_exec();
void znx_modules_main_exit_exec();

znx_bool_t znx_modules_worker_init_handle(void *data);
znx_bool_t znx_modules_worker_proc_exit_handle(void *data);
znx_bool_t znx_modules_worker_exit_handle(void *data);


znx_bool_t znx_core_modules_conf_post_exec();
znx_bool_t znx_http_module_main_conf_post_exec();
znx_bool_t znx_http_module_site_conf_post_exec(znx_http_site_conf_t *site_conf);
